// // 已知由单链表表示的线性表中,含有 3 类字符的数据元素(如:字母字符﹑数字字符和其他字符),
// // 试编写算法构造3个以循环链表表示的线性表,使每个表中只含同一类的字符,
// // 且利用原表中的节点空间作为这三个表的节点空间,头节点可另辟空间。
// #include <stdio.h>
// #include <stdlib.h>
// #include "windows.h"
// #include <assert.h>
// #include <ctype.h>
// // 节点结构
// typedef struct LinkNode {
//     char data;
//     struct LinkNode* next;
// } LinkNode;
//
// // 链表结构
// typedef struct LinkList {
//     LinkNode* head;
// } LinkList;
//
// // 链表初始化
// LinkList* LinkInit() {
//     LinkList* list = (LinkList*)malloc(sizeof(LinkList));
//     list->head = (LinkNode*)malloc(sizeof(LinkNode));
//     list->head->next = list->head; // 初始化为循环链表
//     return list;
// }
//
// // 插入节点到循环链表尾部
// void LinkInsert(LinkList* list, char data) {
//     LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
//     if (newNode == NULL) {
//         perror("malloc failed");
//         exit(EXIT_FAILURE);
//     }
//     newNode->data = data;
//     newNode->next = list->head; // 新节点指向头节点
//
//     LinkNode* tail = list->head->next; // 找到尾节点
//     while (tail->next != list->head) {
//         tail = tail->next;
//     }
//     tail->next = newNode; // 尾节点的next指向新节点
// }
//
// // 打印循环链表
// void printLinkList(LinkList* list) {
//     assert(list);
//     if (list->head->next == list->head) {
//         printf("空链表\n");
//         return;
//     }
//
//     LinkNode* current = list->head->next;
//     do {
//         printf("%c ", current->data);
//         current = current->next;
//     } while (current != list->head);
//     printf("\n");
// }
//
// // 分类字符并构建三个循环链表
// void charFenLei(LinkList* L, LinkList* math, LinkList* ZiMu, LinkList* other) {
//     LinkNode* p = L->head->next;
//     LinkNode* pre = L->head;
//
//     while (p != L->head) {
//         LinkNode* next = p->next; // 保存下一个节点
//         if (isdigit(p->data)) {
//             // 数字字符
//             LinkInsert(math, p->data);
//         } else if (isalpha(p->data)) {
//             // 字母字符
//             LinkInsert(ZiMu, p->data);
//         } else {
//             // 其他字符
//             LinkInsert(other, p->data);
//         }
//         // 从原链表中移除当前节点
//         pre->next = next;
//         free(p);
//         p = next;
//     }
// }
//
// int main() {
//     SetConsoleOutputCP(CP_UTF8);
//     LinkList* original = LinkInit();
//     LinkList* letters = LinkInit();
//     LinkList* digits = LinkInit();
//     LinkList* others = LinkInit();
//
//     // 插入数据到原链表
//     LinkInsert(original, 'a');
//     LinkInsert(original, '1');
//     LinkInsert(original, 'b');
//     LinkInsert(original, '2');
//     LinkInsert(original, '#');
//     LinkInsert(original, '3');
//     LinkInsert(original, 'c');
//     LinkInsert(original, '@');
//
//     printf("原始链表: ");
//     printLinkList(original);
//
//     // 分类字符并构建三个循环链表
//     charFenLei(original, digits, letters, others);
//
//     printf("字母字符链表: ");
//     printLinkList(letters);
//
//     printf("数字字符链表: ");
//     printLinkList(digits);
//
//     printf("其他字符链表: ");
//     printLinkList(others);
//
//     // 释放链表内存
//     LinkNode* current;
//     while (letters->head->next != letters->head) {
//         current = letters->head->next;
//         letters->head->next = current->next;
//         free(current);
//     }
//     free(letters->head);
//     free(letters);
//
//     while (digits->head->next != digits->head) {
//         current = digits->head->next;
//         digits->head->next = current->next;
//         free(current);
//     }
//     free(digits->head);
//     free(digits);
//
//     while (others->head->next != others->head) {
//         current = others->head->next;
//         others->head->next = current->next;
//         free(current);
//     }
//     free(others->head);
//     free(others);
//
//     return 0;
// }